package com.pe.pgn.clubpgn.webapp.controller.venta;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.ClpbProducto;
import com.pe.pgn.clubpgn.domain.ClpmPromocionConsumo;
import com.pe.pgn.clubpgn.domain.ClpmVenta;
import com.pe.pgn.clubpgn.domain.beans.BNTipoVentaManual;
import com.pe.pgn.clubpgn.domain.beans.BNVentaBusqueda;
import com.pe.pgn.clubpgn.service.VentaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;

/**
 * @author Edwin Farfan
 */

@Controller
@RequestMapping("/venta/**")
public class VentaController extends BaseFormController{

	@Autowired
	private VentaService ventaService; 
	
	@RequestMapping(value = "/ventaList.html")
    public  void consultarVenta(HttpServletRequest request,Model model)
     {

		List<ClpmVenta> listaVentas= ventaService.obtenerVentasActivas();
		List<ClpbEstacion> estaciones= ventaService.listadoEstaciones();
		
		model.addAttribute("estaciones",estaciones);
		model.addAttribute("clpmventas", listaVentas);
		model.addAttribute("venta", new BNVentaBusqueda());
	}	
	
	@RequestMapping(value = "/ventaSearch.html", method = RequestMethod.POST)
	public String buscarVentaManual(@ModelAttribute("venta") BNVentaBusqueda venta, 			
		HttpServletRequest request,ModelMap modelMap) {
		
		List<ClpbEstacion> estaciones= ventaService.listadoEstaciones();
		List<ClpmVenta> listaVentas = ventaService.busquedaVentas(venta);
		
		modelMap.addAttribute("estaciones",estaciones);
		modelMap.addAttribute("clpmventas",listaVentas);
		return "/venta/ventaSearch";
	}	
	
	@RequestMapping(value = "/ventaForm.html", method = RequestMethod.GET)
	public @ModelAttribute("ventaForm") ClpmVenta verVentaManual(
			@RequestParam(value = "id", required = false) Long id, 
			HttpServletRequest request, ModelMap modelMap) {
		
		List<ClpmPromocionConsumo> promocionConsumo = ventaService.listadoPromocionConsumo();
		List<ClpbEstacion> estaciones = ventaService.listadoEstaciones();
		
		List<BNTipoVentaManual> listaTipoCorreccion = ventaService.obtenerTiposVentaManual();
		List<ClpbProducto> productos = ventaService.listadoProductos();
		
		modelMap.addAttribute("clpbProducto", productos);
		modelMap.addAttribute("estaciones",estaciones);		
		modelMap.addAttribute("clpmpromocionconsumo", promocionConsumo);
		modelMap.addAttribute("clpbtipoventamanual", listaTipoCorreccion);
		
		if (id != null) {
			ClpmVenta venta = ventaService.obtenerVenta(id);
			return venta;
		}
		
		return new ClpmVenta();
	}
	
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/ventaForm.html", method = RequestMethod.POST)
	public String guardarVentaManual(@ModelAttribute("ventaForm") ClpmVenta venta,
			HttpServletRequest request,ModelMap modelMap) {

		String idCliente = request.getParameter("id_cliente_persona");
		try{
			if(venta.getId()==null){
				if(StringUtils.isNotBlank(idCliente))
				venta.setIdClientePersona(new Long(idCliente));
				
				Map map = ventaService.guardarVenta(venta,false);				
				if(map.get("success") != null){
					saveMessage(request, getText("ventaform.added", "", request.getLocale()));	
				}else{
					if(map.get("error").equals("tarjeta_invalid")){
						saveError(request, getText("ventaform.tarjeta.invalid", "", request.getLocale()));
						return "redirect:ventaForm.html?method=Add&from=list";
					}else if(map.get("error").equals("registro_duplicado")){
						saveError(request, getText("ventaform.registro.invalid", "", request.getLocale()));
						return "redirect:ventaForm.html?method=Add&from=list";
					}else{
						saveError(request, getText("errors.general", request.getLocale()));
						return "redirect:ventaForm.html?method=Add&from=list";
					}
				}				
				
			}else{
				ClpmVenta ventaManual=new ClpmVenta();
				BeanUtils.copyProperties(venta, ventaManual);
				
				//eliminar el registro actual --->anulacion de la venta
				ventaService.eliminarVentaManual(venta);

				ventaManual.setId(null);
				//guardar un nuevo registro con los datos iguales
				Map map = ventaService.guardarVenta(ventaManual,true);
				if(map.get("success") != null){
					saveMessage(request, getText("ventaform.added", "", request.getLocale()));	
				}else{
					if(map.get("error").equals("tarjeta_invalid")){
						saveError(request, getText("ventaform.tarjeta.invalid", "", request.getLocale()));
						return "redirect:ventaForm.html?method=Add&from=list";
					}else if(map.get("error").equals("registro_duplicado")){
						saveError(request, getText("ventaform.registro.invalid", "", request.getLocale()));
						return "redirect:ventaForm.html?method=Add&from=list";
					}else{
						saveError(request, getText("errors.general", request.getLocale()));
						return "redirect:ventaForm.html?method=Add&from=list";
					}
				}
			}
			
			return "redirect:ventaList.html";
		}catch (Exception e) {
			System.out.println("Exception invisible "+e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
			return "redirect:ventaForm.html?method=Add&from=list";
		}
	}
	
	@RequestMapping(value = "/anulacionList.html")
    public String obtenerAnulaciones(ModelMap modelMap) {

		List<ClpmVenta> listaVentas= ventaService.obtenerVentasActivas();
		List<ClpbEstacion> estaciones= ventaService.listadoEstaciones();
		
		modelMap.addAttribute("estaciones",estaciones);
        modelMap.addAttribute("clpmventas", listaVentas);
        return "/venta/anulacionList";
    }

	
	@RequestMapping(value = "/anulacionForm.html", method = RequestMethod.GET)
	public @ModelAttribute("anulacionForm") ClpmVenta verAnulacionManual(
			@RequestParam(value = "id", required = false) Long id, HttpServletRequest request,ModelMap modelMap) {
		
		List<ClpbProducto> productos= ventaService.listadoProductos();
		modelMap.addAttribute("clpbProducto", productos);

		List<ClpmPromocionConsumo> promocionConsumo= ventaService.listadoPromocionConsumo();

		List<ClpbEstacion> estaciones= ventaService.listadoEstaciones();
		
		modelMap.addAttribute("estaciones",estaciones);
		modelMap.addAttribute("clpmpromocionconsumo", promocionConsumo);
		if (id != null) {
			ClpmVenta venta = ventaService.obtenerVenta(id);
			return venta;
		}
		return new ClpmVenta();
	}
	
	@RequestMapping(value = "/anulacionForm.html", method = RequestMethod.POST)
	public String guardarAnulacionManual(@ModelAttribute("anulacionForm") ClpmVenta venta,
			HttpServletRequest request,ModelMap modelMap) {

		String idCliente= request.getParameter("id_cliente_persona");
		try{
			if(venta.getId()==null){
				if(StringUtils.isNotBlank(idCliente))
				venta.setIdClientePersona(new Long(idCliente));
				
				ventaService.guardarVenta(venta,false);
				saveMessage(request, getText("anulacionform.added", "", request.getLocale()));
			}else{
				ClpmVenta ventaManual=new ClpmVenta();
				BeanUtils.copyProperties(venta, ventaManual);
				
				if(StringUtils.isBlank(venta.getCoReciboAnulado())){
					List<ClpbProducto> productos= ventaService.listadoProductos();
					List<ClpmPromocionConsumo> promocionConsumo= ventaService.listadoPromocionConsumo();
					List<ClpbEstacion> estaciones= ventaService.listadoEstaciones();
					
					modelMap.addAttribute("clpbProducto", productos);
					modelMap.addAttribute("estaciones",estaciones);
					modelMap.addAttribute("clpmpromocionconsumo", promocionConsumo);
					
					saveError(request, getText("ventaform.anulacion", request.getLocale()));
					return "/venta/anulacionForm";
				}
				
				//eliminar el registro actual --->anulacion de la venta
				ventaService.eliminarVentaManual(venta);

				ventaManual.setId(null);
				//guardar un nuevo registro con los datos iguales
				ventaService.guardarVenta(ventaManual,true);
				saveMessage(request, getText("anulacionform.added", "", request.getLocale()));
			}
			
			return "redirect:anulacionList.html";
		}catch (Exception e) {
			System.out.println("Exception invisible "+e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
			return "/venta/anulacionForm";
		}
	}
	
	
	@RequestMapping(value = "/clinteForVenta.html", method = RequestMethod.GET)
	public String  listarClientes(
			@RequestParam(value = "coDocumentoId", required = false) String coDocumento,
			@RequestParam(value = "nombreClienteId", required = false) String nombreCliente,
			Model model) {
		
		return "/wizard/clienteventawizardform";
	}	

    
}
